package edu.ptu.shortlink.admin.remote;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import edu.ptu.shortlink.admin.common.convention.result.Result;
import edu.ptu.shortlink.admin.remote.dto.req.*;
import edu.ptu.shortlink.admin.remote.dto.resp.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

/**
 * @BelongsProject: short-link
 * @BelongsPackage: edu.ptu.shortlink.admin.remote
 * @Author: HYJ
 * @CreateTime: 2025-05-15  20:37
 * @Description: 短链接远程调用中台服务
 * @Version: 1.0
 */
@FeignClient(value = "short-link-project")
public interface ShortLinkRemoteService {
    /**
     * 创建短链接
     *
     * @param requestParam 创建短链接请求入参
     * @return 短链接创建响应
     */
    @PostMapping("/api/short-link/v1/create")
    Result<ShortLinkCreateRespDTO> createShortLink(@RequestBody ShortLinkCreateReqDTO requestParam);

    /**
     * 分页查询短链接
     *
     * @return 短链接创建像
     */
    @GetMapping("/api/short-link/v1/page")
    Result<Page<ShortLinkPageRespDTO>> pageShortLink(@SpringQueryMap ShortLinkPageReqDTO requestParam);

    /**
     * 分组查询短链接
     *
     * @param gIds 分组标识
     * @return 分组查询短链接响应
     * <p>
     * /**
     * 统计短链接数量
     * @return 查询分组短链接数量
     */
    @GetMapping("/api/short-link/v1/count")
    Result<List<ShortLinkGroupCountQueryRespDTO>> countShortLink(@RequestParam("gid") List<String> gIds);

    /**
     * 修改短链接
     *
     * @param requestParam 修改短链接请求参数
     */
    @PostMapping("/api/short-link/v1/update")
    void updateShortLink(@RequestBody ShortLinkUpdateReqDTO requestParam);

    /**
     * 获取短链接标题
     *
     * @param url 短链接
     * @return 短链接标题
     */
    @GetMapping("/api/short-link/v1/title")
    Result<String> getUrlTitle(@RequestParam("url") String url);

    /**
     * 保存短链接到回收站
     *
     * @param requestParam 保存短链接到回收站请求参数
     */
    @PostMapping("/api/short-link/v1/recycle-bin")
    void saveToRecycleBin(@RequestBody RecycleBinSaveReqDTO requestParam);

    /**
     * 分页查询回收站短链接
     *
     * @return 分页查询回收站短链接响应
     */
    @GetMapping("/api/short-link/v1/recycle-bin/page")
    Result<Page<ShortLinkPageRespDTO>> pageRecycleBin(@SpringQueryMap RecycleBinPageReqDTO requestParam);

    /**
     * 移除回收站短链接
     *
     * @return 移除回收站短链接响应
     */
    @PostMapping("/api/short-link/v1/recycle-bin/remove")
    void removeFromRecycleBin(@RequestBody RecycleBinSaveReqDTO requestParam);

    /**
     * 单个短链接统计
     *
     * @return 单个短链接统计响应
     */
    @GetMapping("/api/short-link/v1/stats")
    Result<ShortLinkStatsRespDTO> oneShortLinkStats(@SpringQueryMap ShortLinkStatsReqDTO requestParam);

    /**
     * 分页查询日志记录
     *
     * @return 分页查询日志记录响应
     */
    @GetMapping("/api/short-link/v1/stats/access-record")
    Result<Page<ShortLinkStatsAccessRecordRespDTO>> shortLinkStatsAccessRecord(@SpringQueryMap ShortLinkStatsAccessRecordReqDTO requestParam);


    /**
     * 分页分组查询日志记录
     *
     * @return 分页分组查询日志记录响应
     */
    @GetMapping("/api/short-link/v1/stats/access-record/group")
    Result<Page<ShortLinkStatsAccessRecordRespDTO>> groupShortLinkStatsAccessRecord(@SpringQueryMap ShortLinkGroupStatsAccessRecordReqDTO requestParam);

    /**
     * 分组短链接监控
     *
     * @param requestParam 请求参数
     * @return 分组短链接监控结果
     */
    @PostMapping("/api/short-link/v1/stats/group")
    Result<ShortLinkStatsRespDTO> groupShortLinkStats(@RequestBody ShortLinkGroupStatsReqDTO requestParam);

    /**
     * 批量创建短链接
     *
     * @param requestParam 批量创建短链接请求参数
     * @return 批量创建短链接响应
     */
    @PostMapping("/api/short-link/v1/create/batch")
    Result<ShortLinkBatchCreateRespDTO> batchCreateShortLink(@RequestBody ShortLinkBatchCreateReqDTO requestParam);

    /**
     * 从回收站恢复短链接
     *
     * @param requestParam 从回收站恢复短链接请求参数
     */
    @PostMapping("/api/short-link/v1/recycle-bin/recover")
    void recoverFromRecycleBin(@RequestBody RecycleBinSaveReqDTO requestParam);
}




